﻿// ***********************************************************************
// Assembly         : Delta_entidad
// Author           : Juan Alberto Cerino Gomez
// Created          : 04-12-2013
//
// Last Modified By : Juan Alberto Cerino Gomez
// Last Modified On : 06-02-2013
// ***********************************************************************
// <copyright file="AttrParametro.cs" company="Delta Bussines">
//     Copyright (c) 2013  Delta Bussines. All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Delta_util.Estaticos;
using System.Data;

namespace Delta_entidad.Atributos
{
    /// <summary>
    /// Clase que permite indicar la configuración del campo como parametro para las diferentes operaciones del grid.
    /// </summary>
    [Serializable()]
    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public class AttrParametro : System.Attribute
    {
        /// <summary>
        /// Variable que indica el nombre del parametro del procedimiento almacenado.
        /// </summary>
        private string nombreParametro;
        /// <summary>
        /// Variable que indica el tamaño o precisión del campo en la base de datos.
        /// </summary>
        private int precision;
        /// <summary>
        /// Variable que indica el tipo de dato del parametro.
        /// </summary>
        private SqlDbType tipoDato;
        /// <summary>
        /// Variable que indica la dirección del parametro.
        /// </summary>
        private ParameterDirection DireccionPar;
        /// <summary>
        /// Variable que indica en que operaciones se debe enviar el campo como parametro del procedimiento almacenado.
        /// </summary>
        private List<Enumerados.TIPO_QUERY> Tipos = new List<Enumerados.TIPO_QUERY>();

        /// <summary>
        /// Obtiene o establece el nombre del parametro.
        /// </summary>
        /// <value>Nombre del paramtro.</value>
        public string propNombreParametro { get { return nombreParametro; } set { nombreParametro = value; } }
        /// <summary>
        /// Obtiene o establece el tamaño o precisión del parametro.
        /// </summary>
        /// <value>Precisión del parametro.</value>
        public int propPrecision { get { return precision; } set { precision = value; } }
        /// <summary>
        /// Obtiene o establece la lista de los tipos de operaciones en las cuales se deben de enviar el parametro.
        /// </summary>
        /// <value>Lista de operaciones.</value>
        public List<Enumerados.TIPO_QUERY> propTipos { get { return Tipos; } set { Tipos = value; } }
        /// <summary>
        /// Obtiene o establece el tipo de dato del parametro.
        /// </summary>
        /// <value>Tipo de dato del parametro.</value>
        public SqlDbType propTipoDato { get { return tipoDato; } set { tipoDato = value; } }
        /// <summary>
        /// Obtiene o establece la dirección del parametro.
        /// </summary>
        /// <value>Indica la dirección del parametro.</value>
        public ParameterDirection propDireccionPar { get { return DireccionPar; } set { DireccionPar = value; } }


        /// <summary>
        /// Constructor de la clase que solo permite indicar las operaciones en las cuales se envia el parametro.
        /// </summary>
        /// <param name="OperacionesAParticipar">Lista de las operaciones en las cuales el campo va a ser enviado.</param>
        public AttrParametro(params Enumerados.TIPO_QUERY[] OperacionesAParticipar)
        {

            precision = 4;
            tipoDato = SqlDbType.VarChar;
            DireccionPar = ParameterDirection.Input;
            nombreParametro = null;
            Tipos.AddRange(OperacionesAParticipar);
        }

        /// <summary>
        /// Constructor de la clase, que permite configurar el tipo de dato del parametro.
        /// </summary>
        /// <param name="TipoBD">Tipo de dato del parametro.</param>
        /// <param name="OperacionesAParticipar">Lista de las operaciones en las cuales el campo va a ser enviado.</param>
        public AttrParametro(SqlDbType TipoBD, params Enumerados.TIPO_QUERY[] OperacionesAParticipar)
        {
            precision = 4;
            tipoDato = TipoBD;
            DireccionPar = ParameterDirection.Input;
            nombreParametro = null;
            Tipos.AddRange(OperacionesAParticipar);
        }

        /// <summary>
        /// Constructor avanzado de la clase.
        /// </summary>
        /// <param name="TipoBD">Precision del campo en la tabla, por default el valor es 4.</param>        
        /// <param name="PrecisionCampo">The precision campo.</param>
        /// <param name="NombreCampo">Nombre del parametro en el procedimiento almacenado de la operación, su valor por default es null.
        /// <br/>Cabe señalar que no es necesario indicar el nombre cuando el campo tiene el mismo nombre del parametro.</param>
        /// <param name="DireccionParametro">Indica la dirección del parametro, los valores posibles son: Input, Output, InputOutput, ReturnValue.</param>
        /// <param name="OperacionesAParticipar">Lista de las operaciones en las cuales el campo va a ser enviado.</param>
        public AttrParametro(SqlDbType TipoBD,
            int PrecisionCampo = 4,
            string NombreCampo = null,
            ParameterDirection DireccionParametro = ParameterDirection.Input,
            params Enumerados.TIPO_QUERY[] OperacionesAParticipar)
        {
            tipoDato = TipoBD;
            precision = PrecisionCampo;
            DireccionPar = DireccionParametro;
            nombreParametro = NombreCampo;
            if (OperacionesAParticipar != null && OperacionesAParticipar.Count() > 0)
                Tipos.AddRange(OperacionesAParticipar);
        }
    }
}
